﻿
//using NUglify.Css;
//using OfficeOpenXml.Export.HtmlExport.StyleCollectors.StyleContracts;
//using System;
//using System.Collections.Generic;
//using System.IO;
//using System.Linq;
//using System.Reflection;
//using System.Text;
//using System.Threading.Tasks;

//namespace DBConnection.Helper
//{
//    /// <summary>
//    /// Excel导出帮助类
//    /// </summary>
//    internal class ExcelDeriveHelper
//    {
//        /// <summary>
//        /// 导出Excel文件
//        /// </summary>
//        /// <remarks>
//        /// <code>
//        /// 注意：把Model属性需要作为Excel表头的都加上[ExcelColumn("联系ID")]这个特性 ，如果不加这个特性，那么就会以属性名作为表头
//        /// </code>
//        /// </remarks>
//        /// <typeparam name="T">集合数据</typeparam>
//        /// <param name="t"></param>
//        /// <returns>返回文件本地路径</returns>
//        /// <exception cref="Exception"></exception>
//        public static string ExceDerive<T>(List<T> t) where T : class, new()
//        {
//            string filePath = Path.Combine(AppContext.BaseDirectory, "所有Excel文件");  //获取当前项目路径
//            string saveFilePath = string.Empty; //保存文件路径
//            try
//            {
//                // 获取当前时间的时间戳（毫秒）
//                long timestamp = DateTimeOffset.Now.ToUnixTimeMilliseconds();
//                byte[] bytes = ToExcelBytes(t);  //获取将数据转换成字节
//                if (!Directory.Exists(filePath)) //说明该路径下面没有文件  则创建一个文件夹
//                    Directory.CreateDirectory(filePath);
//                string pathStr = DateTime.Now.ToString("yyyyMMddhhmmss") + "_" + timestamp + "共(" + t.Count + ")条.xls";
//                saveFilePath = Path.Combine(filePath, pathStr);  //文件名称
//                using (FileStream fs = new FileStream(saveFilePath, FileMode.Create, FileAccess.Write))  //写入Excel文件
//                {
//                    fs.Write(bytes, 0, bytes.Length);
//                    fs.Flush();
//                    return saveFilePath;  //创建成功
//                }
//            }
//            catch (Exception e)
//            {
//                throw new Exception(e.Message);
//            }
//        }

//        /// <summary>
//        /// 将集合转换成字节数组
//        /// </summary>
//        /// <typeparam name="TEntity"></typeparam>
//        /// <param name="items"></param>
//        /// <returns></returns>
//        private static byte[] ToExcelBytes<TEntity>(IList<TEntity> items) where TEntity : class, new()
//        {
//            var workbook = new HSSFWorkbook();  //HSSFWorkbook()导出Excel最大行数是65536行   XSSFWorkbook()导出Excel最大行数是1048576行
//            ISheet sheet = workbook.CreateSheet("sheet1");  //创建工作簿
//            int sheetNum = 1;  //统计几个工作簿
//            SetTitle<TEntity>(workbook, sheet);  //编写标题
//            int index = 1;  //统计条数
//            int col = 0;  //统计单元格个数
//            foreach (TEntity entity in items)
//            {
//                if (index % 65535 == 0)  //创建多个工资表单  这里就是解决.xls文件导出数据超出65536行的问题 可以用创建多个工作簿来解决这个问题
//                {
//                    sheetNum++; //统计几个工作簿
//                    sheet = workbook.CreateSheet("sheet" + sheetNum);  //创建工作簿
//                    index = 1;  //从第二个工作表单第一行开始插入数据
//                    SetTitle<TEntity>(workbook, sheet);  //编写标题
//                }
//                IRow row = sheet.CreateRow(index);
//                PropertyInfo[] values = entity.GetType().GetProperties();
//                col = 0;
//                foreach (PropertyInfo property in values)  //添加单元格个数
//                {
//                    object val = property.GetValue(entity, null);
//                    if (val == null)
//                        row.CreateCell(col).SetCellValue("");
//                    else
//                        row.CreateCell(col).SetCellValue(val.ToString());
//                    col++;
//                }
//                index++;
//            }
//            //写入
//            using (var file = new MemoryStream())
//            {
//                workbook.Write(file);
//                return file.GetBuffer();
//            }
//        }

//        /// <summary>
//        /// 写入Excel标题方法
//        /// </summary>
//        /// <typeparam name="T"></typeparam>
//        /// <param name="workbook"></param>
//        /// <param name="sheet"></param>
//        private static void SetTitle<T>(HSSFWorkbook workbook, ISheet sheet)
//        {
//            ICellStyle style = workbook.CreateCellStyle();  //创建样式对象
//            IFont fonts = workbook.CreateFont(); //创建字体样式
//            style.FillForegroundColor = HSSFColor.Green.Index;  //设置样式
//            style.FillPattern = FillPattern.SolidForeground;
//            fonts.Color = IndexedColors.Yellow.Index; //字体颜色
//            style.SetFont(fonts);
//            var titles = new List<string>();
//            PropertyInfo[] propertys = typeof(T).GetProperties();
//            foreach (PropertyInfo property in propertys)
//            {
//                object[] excelColumns = property.GetCustomAttributes(typeof(ExcelColumnAttribute), true);
//                if (excelColumns.Length > 0)
//                {
//                    string like = (excelColumns[0] as ExcelColumnAttribute).DisplayNameLike;

//                    if (!string.IsNullOrEmpty(like))
//                    {
//                        titles.Add(like);
//                    }
//                    else
//                    {
//                        titles.Add(property.Name);
//                    }
//                }
//            }

//            //写入
//            IRow row = sheet.CreateRow(0);
//            for (int i = 0; i < titles.Count; i++)
//            {

//                row.CreateCell(i).SetCellValue(titles[i]);
//                row.Cells[i].CellStyle = style; //设置标题单元格和字体样式
//            }
//        }

//    }
//}